#pragma once

#include "Instruction.h"
#include <vector>
#include "Module.h"
#include "PointerType.h"

class GetElementPtrInstruction : public Instruction {
private:
    Value * ptr;
    std::vector<Value *> indices;
    Value * result;

    // 新增：保存数组维度信息
    std::vector<int> arrayDimensions;
    bool dimensionsCalculated;

public:
    // 修改参数类型为 const Type*
    GetElementPtrInstruction(Module * module,
                             Function * func,
                             Value * ptr,
                             std::vector<Value *> indices,
                             const Type * type);

    Value * getPointer() const
    {
        return ptr;
    }
    std::vector<Value *> getIndices() const
    {
        return indices;
    }
    Value * getResult() const
    {
        return result;
    }
    void toString(std::string & str) override;

    // 新增：获取数组维度信息的方法
    /// @brief 获取数组的所有维度信息
    /// @return 包含所有维度大小的vector，从最外层到最内层
    std::vector<int> getArrayDimensions();

    /// @brief 获取数组维度的字符串表示（如 "3 x 4 x 5"）
    /// @return 维度字符串
    std::string getArrayDimensionString();

    /// @brief 获取数组的总元素个数
    /// @return 总元素个数
    int getTotalElementCount();

    /// @brief 检查是否包含有效的数组维度信息
    /// @return true 如果包含有效的数组维度信息
    bool hasValidArrayDimensions() const;

    /// @brief 获取数组的维度数量
    /// @return 维度数量
    int getDimensionCount();

private:
    /// @brief 计算并缓存数组维度信息
    void calculateArrayDimensions();
};